package util

import (
	"encoding/binary"
	"encoding/json"
	"fmt"
	"gin_maker_chat/model"
	"net"
)

// 将util中的方法关联到结构体中

// 读取客户端信息
func ReadMsgByNetCon(conn net.Conn) (msg model.Message, err error) {
	buf := make([]byte, 8096)
	fmt.Println("read info....")
	_, err = conn.Read(buf[:4])

	if err != nil {
		// errors.New("read pkg header err")
		return
	}

	//跟进buf[0:4]转换成uint32
	pkgLen := binary.BigEndian.Uint32(buf[0:4])

	//根据pkgLen读取消息内容
	n, err := conn.Read(buf[:pkgLen])
	if n != int(pkgLen) || err != nil {
		// errors.New("read pkg body err")
		return
	}
	//把pkgLen反序列化  model.Message
	err = json.Unmarshal(buf[:pkgLen], &msg)
	if err != nil {
		fmt.Println("json.Unmarshal err:", err)
		return
	}
	return
}

func WriteMsgByNetCon(con net.Conn, data []byte) (err error) {
	//将data发送到客户端
	//2.1 先将data的长度发送服务器
	//获取data的长度 -> 转成一个表示长度的byte切片
	pkgLen := uint32(len(data))
	var buf = make([]byte, 4)
	binary.BigEndian.PutUint32(buf[0:4], pkgLen)
	//发送长度
	n, err := con.Write(buf[0:4])
	if n != 4 || err != nil {
		fmt.Println(" server sent to len fail ,error=", err)
		return
	}

	n, err = con.Write(data)
	if n != int(pkgLen) || err != nil {
		fmt.Println(" server con.Write fail ,error=", err)
		return
	}

	return
}
